
/**
题目:
   给定一个单链表 L：L0→L1→…→Ln-1→Ln ，
   将其重新排列后变为： L0→Ln→L1→Ln-1→L2→Ln-2→…
   你不能只是单纯的改变节点内部的值，而是需要实际的进行节点交换。
   示例 1:
   给定链表 1->2->3->4, 重新排列为 1->4->2->3.
   示例 2:
   给定链表 1->2->3->4->5, 重新排列为 1->5->2->4->3.
思路:
    快慢指针找中点,反转,合并 注意将边界指针 设置为nil
效果:
     执行用时：12 ms, 在所有 Go 提交中击败了78.08%的用户
     内存消耗：5.3 MB, 在所有 Go 提交中击败了100.00%的用户                                   
*/
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func reorderList(head *ListNode)  {
    if head == nil || head.Next == nil{
        return 
    }

    fast,slow := head,head
    for fast != nil && fast.Next != nil && fast.Next.Next != nil{
        fast = fast.Next.Next
        slow = slow.Next
    }
    fast = slow.Next
    slow.Next = nil
    slow = head
    // 1-2 
    // 3-4
    var pre,cur,next *ListNode
    cur,next = fast,fast.Next
    for cur != nil{
        cur.Next = pre
        pre = cur
        cur = next
        if next != nil{
            next = next.Next
        }
    }
    fast = pre
    for fast != nil  && slow != nil{
        t1,t2 := slow,fast
        fast = fast.Next
        slow = slow.Next
        t1.Next = t2
        t2.Next = slow
    }
    if fast != nil{
        slow.Next = fast
    }
}